home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
IRIS Performer 2.2 Friends Demo
/
SGI IRIS Performer 2.2 Friends Demo.iso
/
friends
/
openworlds
/
tix
/
DialogS.tcl
< prev
next >
Wrap
Text File
|
1997-11-22
|
4KB
|
181 lines
# The DialogShell widget lets the window manager know that it
# is a dialog window. Among other things:
# - It popups up automatically with requiring the user to hit the
# mouse another time
# - It centers itself over a parent widget
# - It iconifies itself when the parent widget is iconifies
#
#
# Adapted from Joseph Wang's implementation for Tix 3.6. Rewritten to
# follow the new OOP mechanism in Tix 4.0
#
# Original author:
#
# Written by Joseph Wang (joe@mit.edu)
# Part of the Globewide Network Academy
# Macvicar School of Education and Technology
#
# If the user does not give value
# the title and parent is dynamically configured.
#
tixWidgetClass tixDialogShell {
-superclass tixShell
-classname TixDialogShell
-method {
popdown popup center
}
-flag {
-mapped -minheight -minwidth -parent -transient
}
-static {}
-configspec {
{-mapped mapped Mapped 0}
{-minwidth minWidth MinWidth 0}
{-minheight minHeight MinHeight 0}
{-transient transient Transient true}
{-parent parent Parent {}}
}
}
#----------------------------------------------------------------------
# Construct widget
#----------------------------------------------------------------------
proc tixDialogShell::ConstructWidget {w} {
upvar #0 $w data
tixChainMethod $w ConstructWidget
# Set the title of this shell appropriately
#
if {$data(-title) == {}} {
# dynamically sets the title
#
set data(-title) [winfo name $w]
}
wm title $w $data(-title)
# Set the parent of this dialog shell
#
if {$data(-parent) == {}} {
set data(-parent) [winfo parent $w]
}
# Set the minsize and maxsize of the thing
#
wm minsize $w $data(-minwidth) $data(-minheight)
}
# The next procedures manage the dialog boxes
#
proc tixDialogShell::popup {w {parent {}}} {
upvar #0 $w data
# First update to make sure the boxes are the right size
#
update idletask
# Then we set the position and update
#
tixDialogShell::center $w $parent
# if [winfo ismapped $w] {
# wm withdraw $w
# }
# and now make it visible. Viola! Centered over parent.
#
wm deiconify $w
}
# This procedure centers a dialog box over a window making sure that the
# dialog box doesn't appear off the screen
#
# However, if the parent is smaller than this dialog, make this dialog
# appear at parent(x,y) + (20,20)
#
proc tixDialogShell::center {w {parent {}}} {
upvar #0 $w data
# Tell the WM that we'll do this ourselves.
wm sizefrom $w user
wm positionfrom $w user
if {$parent == {}} {
set parent $data(-parent)
}
if [catch {set parent [winfo toplevel $parent]}] {
set parent "."
}
# Where is my parent and what are it's dimensions
#
if {$parent != ""} {
set pargeo [split [wm geometry $parent] "+x"]
set parentW [lindex $pargeo 0]
set parentH [lindex $pargeo 1]
set parx [lindex $pargeo 2]
set pary [lindex $pargeo 3]
if {[tixGetBoolean -nocomplain $data(-transient)]} {
wm transient $w $parent
}
} else {
set parentW [winfo screenwidth $w]
set parentH [winfo screenheight $w]
set parx 0
set pary 0
set parent [winfo parent $w]
}
# What are is the offset of the virtual window
set vrootx [winfo vrootx $parent]
set vrooty [winfo vrooty $parent]
# What are my dimensions ?
set dialogW [winfo reqwidth $w]
set dialogH [winfo reqheight $w]
if {$dialogW < [expr $parentW-30] || $dialogW < [expr $parentH-30]} {
set dialogx [expr $parx+($parentW-$dialogW)/2+$vrootx]
set dialogy [expr $pary+($parentH-$dialogH)/2+$vrooty]
} else {
# This dialog is too big. Place it at (parentx, parenty) + (20,20)
#
set dialogx [expr $parx+20+$vrootx]
set dialogy [expr $pary+20+$vrooty]
}
set maxx [expr "[winfo screenwidth $parent] - $dialogW"]
set maxy [expr "[winfo screenheight $parent] - $dialogH"]
# Make sure it doesn't go off screen
#
if {$dialogx < 0} {
set dialogx 0
} else {
if {$dialogx > $maxx} {
set dialogx $maxx
}
}
if {$dialogy < 0} {
set dialogy 0
} else {
if {$dialogy > $maxy} {
set dialogy $maxy
}
}
# set my new position (and dimensions)
#
if {[wm geometry $w] == "1x1+0+0"} {
wm geometry $w $dialogW\x$dialogH\+$dialogx\+$dialogy
}
}
proc tixDialogShell::popdown {w args} {
wm withdraw $w
}